#include	<stdio.h>
#include    <string.h>
#include	<sys/types.h>
#include	<dirent.h>
#include	<sys/stat.h>

void do_ls(char[]);
void dostat(char *);
void show_file_info( char *, struct stat *);
void mode_to_letters( int , char [] );
char *uid_to_name( uid_t );
char *gid_to_name( gid_t );

int main(int argc, char *argv[])
{
	if ( argc == 1 )
			do_ls( "." );
				else
						while ( --argc ){
									printf("%s:\n", *++argv );
												do_ls( *argv );
														}

															return 0;
															}

															void do_ls( char dirname[] )
															{
																DIR		*dir_ptr;		
																	struct dirent	*direntp;		

																		if ( ( dir_ptr = opendir( dirname ) ) == NULL )
																				fprintf(stderr,"ls1: cannot open %s\n", dirname);
																					else
																						{
																								while ( ( direntp = readdir( dir_ptr ) ) != NULL )
																											dostat( direntp->d_name );
																													closedir(dir_ptr);
																														}
																														}

																														void dostat( char *filename )
																														{
																															struct stat info;

																																if ( stat(filename, &info) == -1 )		
																																		perror( filename );			
																																			else					
																																					show_file_info( filename, &info );
																																					}

																																					void show_file_info( char *filename, struct stat *info_p )
																																					{
																																						char	*uid_to_name(), *ctime(), *gid_to_name(), *filemode();
																																							void	mode_to_letters();
																																							        char    modestr[11];

																																									mode_to_letters( info_p->st_mode, modestr );

																																										printf( "%s"    , modestr );
																																											printf( "%4d "  , (int) info_p->st_nlink);	
																																												printf( "%-8s " , uid_to_name(info_p->st_uid) );
																																													printf( "%-8s " , gid_to_name(info_p->st_gid) );
																																														printf( "%8ld " , (long)info_p->st_size);
																																															printf( "%.12s ", 4+ctime(&info_p->st_mtime));
																																																printf( "%s\n"  , filename );

																																																}

																																																void mode_to_letters( int mode, char str[] )
																																																{
																																																    strcpy( str, "----------" );           

																																																        if ( S_ISDIR(mode) )  str[0] = 'd';    
																																																	    if ( S_ISCHR(mode) )  str[0] = 'c';    
																																																	        if ( S_ISBLK(mode) )  str[0] = 'b';    

																																																		    if ( mode & S_IRUSR ) str[1] = 'r';    
																																																		        if ( mode & S_IWUSR ) str[2] = 'w';
																																																			    if ( mode & S_IXUSR ) str[3] = 'x';

																																																			        if ( mode & S_IRGRP ) str[4] = 'r';    
																																																				    if ( mode & S_IWGRP ) str[5] = 'w';
																																																				        if ( mode & S_IXGRP ) str[6] = 'x';

																																																					    if ( mode & S_IROTH ) str[7] = 'r';    
																																																					        if ( mode & S_IWOTH ) str[8] = 'w';
																																																						    if ( mode & S_IXOTH ) str[9] = 'x';
																																																						    }

																																																						    #include	<pwd.h>

																																																						    char *uid_to_name( uid_t uid )
																																																						    {
																																																						    	struct	passwd *getpwuid(), *pw_ptr;
																																																								static  char numstr[10];

																																																									if ( ( pw_ptr = getpwuid( uid ) ) == NULL ){
																																																											sprintf(numstr,"%d", uid);
																																																													return numstr;
																																																														}
																																																															else
																																																																	return pw_ptr->pw_name ;
																																																																	}

																																																																	#include	<grp.h>

																																																																	char *gid_to_name( gid_t gid )
																																																																	{
																																																																		struct group *getgrgid(), *grp_ptr;
																																																																			static  char numstr[10];

																																																																				if ( ( grp_ptr = getgrgid(gid) ) == NULL ){
																																																																						sprintf(numstr,"%d", gid);
																																																																								return numstr;
																																																																									}
																																																																										else
																																																																												return grp_ptr->gr_name;
																																																																												}

